#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include "Arquivo.h"
#include "AbrirArquivoException.h"
#include "FimArquivoException.h"

Arquivo::Arquivo(){
}

Arquivo::Arquivo(char* fileName){
	this->fileName = fileName;
}

void Arquivo::abrirArquivo(char* modoAbertura){
	if((arq = fopen(this->fileName, modoAbertura)) == NULL){
		throw abrirArquivoException;
	}
}

void Arquivo::abrirArquivo(){
	if((arq = fopen(this->fileName, "a+b")) == NULL){
		throw abrirArquivoException;
	}
}

void Arquivo::escreverArquivo(std::string str, bool manipularEstado){
	if(manipularEstado){
		this->abrirArquivo();
	}
	fseek(arq, 0, SEEK_END);
	//*
	for(int i=0;i<str.length();i++){
		fwrite(&str[i], sizeof(char), 1, arq);
	}
	if(manipularEstado){
		this->fecharArquivo();
	}
}

std::string Arquivo::lerArquivo(bool manipularEstado){
	std::string retorno, auxiliar;
	char caracter;
	if(manipularEstado){
		this->abrirArquivo();	
	}

	while(!feof(arq)){
		retorno.append(1,getc(this->getFile()));
	}

	if(manipularEstado){
		this->fecharArquivo();
	}
	
	return retorno;
}

void Arquivo::reiniciarArquivo(){
	fseek(arq, 0, SEEK_SET);
}

int Arquivo::getNextChar(){
	return getc(arq);	
}

void Arquivo::fecharArquivo(){
	fclose(arq);
}

FILE* Arquivo::getFile(){
	return this->arq;
}
void Arquivo::reiniciarArquivo(FILE* input){
	if(this->arq != NULL){
		delete arq;
	}
	arq = input;
}
void Arquivo::setFileName(char* fileName){
	this->fileName = fileName;
}